﻿using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using SharepointCommon;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Uportal.Shp.Core.Common;
using Uportal.Shp.Core.Const;
using Uportal.Shp.Core.Items;
using Uportal.Shp.Core.Model;
using Uportal.Shp.Core.Services;

namespace Uportal.Shp.Init.TJ
{
    class ReminderFeedBackTJ : SPJobDefinition
    {
        NLogLogger _logger = new NLogLogger(@"c:\Temp\Logs\Uportal.TJ_${shortdate}.log");

        public override string Description
        {
            get
            {
                return CustomDescription;
            }
        }

        private string CustomDescription { get; set; }

        #region _Constructors_
        public ReminderFeedBackTJ()
        {
        }

        public ReminderFeedBackTJ(string jobName, SPService service, SPServer server, SPJobLockType targetType)
            : base(jobName, service, server, targetType)
        {
        }

        public ReminderFeedBackTJ(string jobName, SPWebApplication webApplication)
            : base(jobName, webApplication, null, SPJobLockType.ContentDatabase)
        {
            this.Title = "Uportal.ReminderFeedBack";
            this.CustomDescription = "Отчет модератору о неотвеченных вопросах.";
            var shedule = new SPWeeklySchedule()
                              {
                                  BeginDayOfWeek = DayOfWeek.Monday,
                                  BeginHour = 5,
                                  BeginMinute = 0,
                                  BeginSecond = 11,

                                  EndDayOfWeek = DayOfWeek.Monday,
                                  EndHour = 6,
                                  EndMinute = 0,
                                  EndSecond = 12
                              };
            this.Schedule = shedule;
        }

        public override void Execute(System.Guid targetInstanceId)
        {
            base.Execute(targetInstanceId);
            SPSecurity.RunWithElevatedPrivileges(RunReport);
        }
        #endregion

        public void RunReport()
        {
            try
            {
                _logger.Info("Start TJ");
                var site = new Guid(Properties["SiteId"].ToString());
                _logger.Info("siteId:" + site);
                var web = new Guid(Properties["WebId"].ToString());
                _logger.Info("webId:" + web);

                using (var w = WebFactory.Open(site, web))
                {
                    string bodyBegin = @"<table> <tr><td></td></tr>";
                    string bodyFinish = @"</table>";
                    string bodyRow = @"<tr  bgcolor='#ffffff' valign=top align=left><td>{0}</td></tr>";
                    string body = string.Empty;

                    string messageToModerator = @"Привет Тебе!<br/>
                                            Портал Юлмарт напоминает тебе, что на эти вопросы, руководители не ответили, свяжись с ними и напомни :<br/>";
                    string messageToManager = @"Доброе время суток!<br>
                                            Напоминаем Вам, что у вас есть не отвеченный {0} в на портале в разделе «Связь с руководством» <br/>
                                            Просим вас уделить немного своего времени и ответить сотруднику на вопрос.<br/>
                                            Если у вас нет возможности, времени или возникают технические трудности, просим вас сообщить об этом по почте uportal@ulmart.ru<br/><br/>
                                            Спасибо за участие!";

                    //using (var feedback = new FeedbackManager())
                    //{
                        string subj = string.Empty;
                        _logger.Info("GetReport");
                        var items = FeedbackManager.GetReport(w).ToList();
                        if (items != null)
                        {
                            _logger.Info("items.Count:" + items.Count().ToString());
                            foreach (FeedbackItems item in items)
                            {
                                var itemUrl = @"<a href='" + item.ParentList.FormUrl(PageType.Edit) + "'>вопрос</a><br/>";
                                body += string.Format(bodyRow, itemUrl);
                                _logger.Info("body:" + body);
                            }
                        }
                        else
                        {
                            bodyBegin = string.Empty;
                            bodyFinish = string.Empty;
                            body = "Вопросов без ответа нет";
                            _logger.Info("body:" + body);
                        }
                        //говно код,сука,никогда не умрет!!! вынести в feedback manager
                        if (items != null)
                        {
                            subj = "У вас есть неотвеченный вопрос";
                            foreach (FeedbackItems item in items)
                            {
                                var fieldManager = (SPFieldUser)item.ListItem.Fields["Кому"];
                                _logger.Info("fieldManager");
                                var manager = (SPFieldUserValue)fieldManager.GetFieldValue(item.ListItem["whom"].ToString());
                                _logger.Info("manager:" + manager.ToString());
                                var itemUrl = @"<a href='" + item.ParentList.FormUrl(PageType.Edit) + "'>вопрос</a><br/>";
                                var message = string.Format(messageToManager, itemUrl);

                                _logger.Info("user.Email:" + manager.User.Email);
                                _logger.Info("subj:" + subj);
                                _logger.Info("message:" + message);


                                MailHelper.SendEmail(w.Web, manager.User.Email, subj, message);
                            }
                        }
                    //}
                    
                    //получаем пользователей в группе "Модератор"и отправляем им письмо
                    SPGroup group = w.Web.Groups[GetGroupName(w.Web.Url)];
                    string subjReport = "Отчет об не ответивших вопросов";
                    foreach (SPUser user in group.Users)
                    {
                        MailHelper.SendEmail(w.Web, user.Email, subjReport, messageToModerator + bodyBegin + body + bodyFinish);
                    }
                    
                    _logger.Info("Finish TJ");
                }
            }
            catch (Exception ex)
            {
                SPSecurity.RunWithElevatedPrivileges(() => _logger.Exception(ex));
            }

        }

        private string GetGroupName(string webUrl)
        {
            string url = string.Empty;
            using (var w = WebFactory.Open(webUrl))
            {
                _logger.Info("webUrl:" + webUrl);
                _logger.Info("UportalSettingListUrl:" + ListInfo.UportalSettingListUrl);
                var item = w.GetByUrl<UportalSettings>(ListInfo.UportalSettingListUrl).Items(CamlQuery.Default).FirstOrDefault();
                _logger.Info("item.ModeratorGroup:" + item.ModeratorGroup);
                return item.ModeratorGroup;
            }
            return url;
        }
    }
}
